<?php
! (defined('XOOPS_TRUST_PATH')&&defined('XOOPS_ROOT_PATH')) and exit('set trust path and root path');
/**
 *  Xanhte_Controller.php
 *
 *  @author     {$author}
 *  @package    Xanhte
 *  @version    $Id: Xanhte_Controller.php 163 2008-03-11 18:54:07Z mikhail.miguel $
 */

/** アプリケーションベースディレクトリ */
define('BASE', dirname(dirname(__FILE__)));

/** performで値を返す用のアプリケーションGATEWAYの設定 */
/* define('GATEWAY_PASSTHRU', 1000); */

/** include_pathの設定(アプリケーションディレクトリを追加) */
$app = BASE . "/app";
$lib = BASE . "/lib";
// ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . implode(PATH_SEPARATOR, array($app, $lib)));
ini_set('include_path', '.' . PATH_SEPARATOR . implode(PATH_SEPARATOR, array($app, $lib)));


/** アプリケーションライブラリのインクルード */
require_once 'Ethna/Ethna.php';
require_once 'Xanhte_Error.php';
require_once 'Xanhte_DB_PEAR.php';
require_once 'Xanhte_BackendLegacy.php';
require_once 'Xanhte_ActionClass.php';
require_once 'Xanhte_ActionForm.php';
require_once 'Xanhte_ViewClass.php';
require_once 'Xanhte_AppManager.php';
require_once 'Xanhte_AppObject.php';
require_once 'Xanhte_Session.php';
require_once 'Xanhte_Cookie.php';
require_once 'Xanhte_EthnaConfig.php';
require_once 'Xanhte_MailSender.php';
require_once 'Xanhte_Const.php';

// lib
require_once 'ITT_Util.php';
require_once 'ITT_Uploader.php';


/**
 *  Xanhteアプリケーションのコントローラ定義
 *
 *  @author     {$author}
 *  @access     public
 *  @package    Xanhte
 */
class Xanhte_Controller extends Ethna_Controller
{
    /**#@+
     *  @access private
     */

    /**
     *  @var    string  アプリケーションID
     */
    var $appid = 'XANHTE';

    /**
     *  @var    array   forward定義
     */
    var $forward = array(
        /*
         *  TODO: ここにforward先を記述してください
         *
         *  記述例：
         *
         *  'index'         => array(
         *      'view_name' => 'Xanhte_View_Index',
         *  ),
         */
    );

    /**
     *  @var    array   action定義
     */
    var $action = array(
        /*
         *  TODO: ここにaction定義を記述してください
         *
         *  記述例：
         *
         *  'index'     => array(),
         */
    );

    /**
     *  @var    array   soap action定義
     */
    var $soap_action = array(
        /*
         *  TODO: ここにSOAPアプリケーション用のaction定義を
         *  記述してください
         *  記述例：
         *
         *  'sample'            => array(),
         */
    );

    /**
     *  @var    array       アプリケーションディレクトリ
     */
    var $directory = array(
        'action'        => 'app/action',
        'action_cli'    => 'app/action_cli',
        'action_xmlrpc' => 'app/action_xmlrpc',
        'app'           => 'app',
        'plugin'        => 'app/plugin',
        'bin'           => 'bin',
        'etc'           => 'etc',
        'filter'        => 'app/filter',
        'locale'        => 'locale',
        'log'           => 'log',
        'plugins'       => array('app/plugin/Smarty'),		
        'template'      => 'template',
        'template_c'    => 'tmp',
        'tmp'           => 'tmp',
        'view'          => 'app/view',
        'www'           => 'www',
    );

    /**
     *  @var    array       DBアクセス定義
     */
    var $db = array(
        ''              => DB_TYPE_RW,
    );

    /**
     *  @var    array       拡張子設定
     */
    var $ext = array(
        'php'           => 'php',
        'tpl'           => 'html',
    );

    /**
     *  @var    array   クラス定義
     */
    var $class = array(
        /*
         *  TODO: 設定クラス、ログクラス、SQLクラスをオーバーライド
         *  した場合は下記のクラス名を忘れずに変更してください
         */
        'class'         => 'Ethna_ClassFactory',
        'backend'       => 'Xanhte_BackendLegacy',
        'config'        => 'Xanhte_EthnaConfig',
        'db'            => 'Xanhte_DB_PEAR',
        'error'         => 'Ethna_ActionError',
        'form'          => 'Xanhte_ActionForm',
        'i18n'          => 'Ethna_I18N',
        'logger'        => 'Ethna_Logger',
        'plugin'        => 'Ethna_Plugin',
        'session'       => 'Xanhte_Session',
        'sql'           => 'Ethna_AppSQL',
        'view'          => 'Xanhte_ViewClass',
        'renderer'      => 'Xanhte_Renderer_XoopsTpl',
        'url_handler'   => 'Xanhte_UrlHandler',
		'cookie'        => 'Xanhte_Cookie',
		);

    /**
     *  @var    array       検索対象となるプラグインのアプリケーションIDのリスト
     */
    var $plugin_search_appids = array(
        /*
         *  プラグイン検索時に検索対象となるアプリケーションIDのリストを記述します。
         *
         *  記述例：
         *  Common_Plugin_Foo_Bar のような命名のプラグインがアプリケーションの
         *  プラグインディレクトリに存在する場合、以下のように指定すると
         *  Common_Plugin_Foo_Bar, Xanhte_Plugin_Foo_Bar, Ethna_Plugin_Foo_Bar
         *  の順にプラグインが検索されます。 
         *
         *  'Common', 'Xanhte', 'Ethna',
         */
        'Xanhte', 'Ethna',
    );

    /**
     *  @var    array       フィルタ設定
     */
    var $filter = array(
        /*
         *  TODO: フィルタを利用する場合はここにそのプラグイン名を
         *  記述してください
         *  (クラス名を指定するとfilterディレクトリからフィルタクラス
         *  を読み込みます)
         *
         *  記述例：
         *
         *  'ExecutionTime',
         */
		'MagicQuotesGPCCanceler',
    );

    /**
     *  @var    array   smarty modifier定義
     */
    var $smarty_modifier_plugin = array(
        /*
         *  TODO: ここにユーザ定義のsmarty modifier一覧を記述してください
         *
         *  記述例：
         *
         *  'smarty_modifier_foo_bar',
         */
    );

    /**
     *  @var    array   smarty function定義
     */
    var $smarty_function_plugin = array(
        /*
         *  TODO: ここにユーザ定義のsmarty function一覧を記述してください
         *
         *  記述例：
         *
         *  'smarty_function_foo_bar',
         */
    );

    /**
     *  @var    array   smarty block定義
     */
    var $smarty_block_plugin = array(
        /*
         *  TODO: ここにユーザ定義のsmarty block一覧を記述してください
         *
         *  記述例：
         *
         *  'smarty_block_foo_bar',
         */
    );

    /**
     *  @var    array   smarty prefilter定義
     */
    var $smarty_prefilter_plugin = array(
        /*
         *  TODO: ここにユーザ定義のsmarty prefilter一覧を記述してください
         *
         *  記述例：
         *
         *  'smarty_prefilter_foo_bar',
         */
    );

    /**
     *  @var    array   smarty postfilter定義
     */
    var $smarty_postfilter_plugin = array(
        /*
         *  TODO: ここにユーザ定義のsmarty postfilter一覧を記述してください
         *
         *  記述例：
         *
         *  'smarty_postfilter_foo_bar',
         */
    );

    /**
     *  @var    array   smarty outputfilter定義
     */
    var $smarty_outputfilter_plugin = array(
        /*
         *  TODO: ここにユーザ定義のsmarty outputfilter一覧を記述してください
         *
         *  記述例：
         *
         *  'smarty_outputfilter_foo_bar',
         */
    );

    /**#@-*/
	function Xanhte_Controller($gateway = GATEWAY_WWW)
	{
		parent::Ethna_Controller($gateway);
		
		$this->directory['tmp']        = XOOPS_TRUST_PATH.'/cache/tmp';
		$this->directory['template_c'] = XOOPS_TRUST_PATH.'/cache/tmp';
		$this->directory['log']        = XOOPS_TRUST_PATH.'/cache/tmp/log';
		
		if (!file_exists($this->directory['log'])){
			Ethna_Util::mkdir($this->directory['log'], 0777);
		}
		if (!file_exists($this->directory['tmp'])){
			Ethna_Util::mkdir($this->directory['tmp'], 0777);
		}
		
	}
	
	
    function main($class_name, $action_name = "", $fallback_action_name = "")
    {
		$c =& Xanhte_Controller::getInstance();
		if (is_null($c)){
			$c =& new $class_name;
		}
        $c->trigger($action_name, $fallback_action_name);
    }
	
	
    /**
     *  値を返す用のエントリポイント(WWWをExtend)
     *
     *  @access public
     *  @param  string  $class_name     アプリケーションコントローラのクラス名
     *  @param  string  $action_name    実行するアクション名
     *  @param  array   $params         ActionFormに渡すパラメータ
     *  @static
     */
	function main_PassThru($class_name, $action_name, $params=null)
    {
        $c =& new $class_name(GATEWAY_WWW); /// WWW で代用→ActionClassはWWWのActiondirへ :(
		$c->action_passthru[$action_name] = array();
		return $c->triggerPassThru($action_name, $params);
    }
	
	
    /**
     *  Ethnaを実行して値を返す実際には、Actionのperform()でreturnする値をpassthruする
     *
     *  @access public
     *  @param  string  $action_name    実行するアクション名
     *  @static
     */
	function triggerPassThru($action_name = "", $params=null)
	{
		// アクション定義の取得
		$action_obj =& $this->_getAction($action_name);
		if (is_null($action_obj)) {
			return Ethna::raiseError("undefined pathaction [%s]", E_APP_UNDEFINED_ACTION, $action_name);
		}

		// 言語設定
		if (is_null($this->language)){
			$this->_setLanguage($this->language, $this->system_encoding, $this->client_encoding);
		}

		// オブジェクト生成
		$backend =& $this->getBackend();

		$form_name = $this->getActionFormName($action_name);
		$this->action_form =& new $form_name($this);
		$this->action_form->setFormVars($params);
		
		// バックエンド処理実行
		$backend->setActionForm($this->action_form);
		
		$session =& $this->getSession();
		$session->restore();
		return $backend->perform($action_name);
	}
}

